4
תגובות
הדוקומנטציה אומרת שב-use שמות של Namespaces יכולים להיות רק Fully Qualified. מה אם אני רוצה לשים שם Qualified Class Name (בשביל לעשות לו Alias)? ובבקשה אל תגידו לי לעשות נתיב מלא כולל ה-Namespace הנוכחי, כי אז אנחנו מגיעים להכפלת קוד. (ובכלל, כל מיני קטעים עם Namespaces זה הכפלת קוד. לפחות כרגע.)
4 תשובות
ענה
iiddaannyy
ב
29 ליוני 2013
#
לא הצלחתי להבין על איזה מקרה אתה מדבר (הרבה זמן לא נגעתי ב-php...).
תוכל להביא דוגמה?
אוקיי, אז נניח שיש לי את היררכיית מרחבי השמות (Namespaces) הבאה:
A
B
C
D
E
B
C
D
E
ונניח שהשמות ארוכים יותר מזה. אני נמצא כרגע במרחב השמות A, ואני רוצה להשתמש ב-E. אז הייתי רוצה להשתמש במשפט use ולעשות לו Alias (למשל פשוט E) במקום לכתוב B\C\D\E. אז אני יכול לעשות:
use A\B\C\D\E as E;
אבל מה אם ההיררכיה תשתנה? (אני רוצה נתיב יחסי. ואי אפשר ב-use.) אוף, זה מבלבל אותי כל הקטע עם מרחבי השמות. אני משנה חלק אחד שם - צריך לשנות במיליון וחצי מקומות אחרים.
ענה
iiddaannyy
ב
30 ליוני 2013
#
העניין של מרחב השמות ב-php די בעייתי ומוגבל.
ב-php כל מרחב שמות הוא אינדיבידואלי, הוא עצמאי. אתה לא יכול להכניס מרחב שמות אחד בתוך אחר.
זה אומר שהקוד הזה לא יעבוד:
namespace A {
use B\c;
c::hi();
}
namespace A\B {
class c {
static function hi() { echo 'hi'; }
}
}
use B\c;
c::hi();
}
namespace A\B {
class c {
static function hi() { echo 'hi'; }
}
}
כי הוא לא מצליח למצוא את המחלקה c בתוך מרחב השמות B. הסיבה: לא קיים מרחב שמות B.
בקוד הנ"ל קיימים שני מרחבי שמות נפרדים לחלוטין. האחד הוא A והשני הוא A\B.
מה שהיינו מצפים זה שיהיה את A ובתוכו יהיה את B. אבל זה לא ככה. B לא בתוך A כי אין כזה דבר ב-php.
ב-php כל מרחב שמות הוא עצמאי ולא נמצא בתוך מרחב שמות אחר.
אבל, הודות ל-IDE טוב אתה יכול לחסוך את כל כאב הראש הזה והוא ידאג לטפל בכל ה-useים לבד.
אם תסתכל בפריימוורק שהתחלתי לעשות לפני מאה שנה ועצרתי משום-מה, תראה שם שבכל מחלקה יש רשימה נכבדת של useים. אתה באמת חושב שאני כתבתי את כל זה? ממש לא. כשרציתי להשתמש במחלקה מסוימת פשוט רשמתי אותה והעורך (phpstorm במקרה שלי) דאג להוסיף את ה-use המתאים למעלה.